Decorators এবং Wrapped Collections

Java Technologies - অ্যাপাচি কমন্স কালেকশনস (Apache Common Collection)
161
161

Apache Commons Collections একটি শক্তিশালী লাইব্রেরি যা Java Collections Framework-এর উপর অতিরিক্ত ক্ষমতা এবং কার্যকারিতা যোগ করে। এই লাইব্রেরিটি Decorators এবং Wrapped Collections সরবরাহ করে, যা কোলেকশনের বৈশিষ্ট্য বাড়াতে এবং কাস্টম আচরণ প্রদান করতে সহায়তা করে। Decorator এবং Wrapped Collections উভয়ই কোলেকশনের আচার-আচরণ পরিবর্তন করতে ব্যবহৃত হয়, যেমন কোলেকশনের উপাদানগুলি ফিল্টার করা, কোলেকশনের স্টেটাস পরিবর্তন করা, এবং আরও অনেক কিছু।

এই নিবন্ধে আমরা Decorators এবং Wrapped Collections এর কাজ এবং ব্যবহারের উপায় নিয়ে বিস্তারিত আলোচনা করব।


১. Decorators কী?

Decorator প্যাটার্ন একটি ডিজাইন প্যাটার্ন যা মূল অবজেক্টের আচরণ পরিবর্তন করতে ব্যবহৃত হয়, তবে অবজেক্টের মূল কাঠামো অপরিবর্তিত থাকে। Apache Commons Collections-এ Decorators কোলেকশনের অবজেক্টের উপরে অতিরিক্ত আচরণ যোগ করতে ব্যবহার করা হয়। এটি কোলেকশনের আচরণ পরিবর্তন করতে সাহায্য করে, যেমন কোলেকশনে আইটেম অ্যাড বা রিমুভ করা, অথবা কোলেকশনের উপাদানগুলির উপর শর্ত প্রয়োগ করা ইত্যাদি।

Collection Decorators সাধারণত একটি বিদ্যমান কোলেকশন ক্লাসকে মোড়ানো (wrap) করে এবং সেই কোলেকশনের ওপর নতুন আচরণ বা ফাংশন যোগ করে।

১.১ উদাহরণ: ListDecorator

ListDecorator হল একটি সাধারণ উদাহরণ যেখানে একটি List কোলেকশনের উপরে অতিরিক্ত কার্যকারিতা যোগ করা হয়।

import org.apache.commons.collections4.ListUtils;
import java.util.ArrayList;
import java.util.List;

public class DecoratorExample {
    public static void main(String[] args) {
        // Create a list
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("banana");
        
        // Decorate the list with additional functionality
        List<String> decoratedList = ListUtils.predicatedList(list, s -> s.length() > 5);
        
        // Adding a valid element (length > 5)
        decoratedList.add("cherry");
        
        // Adding an invalid element (length <= 5), this will not be added due to the predicate
        decoratedList.add("kiwi");
        
        System.out.println(decoratedList);  // Output: [apple, banana, cherry]
    }
}

এখানে:

  • ListUtils.predicatedList() মেথড ব্যবহার করে একটি predicate যোগ করা হয়েছে যা কেবলমাত্র পাঁচ অক্ষরের বেশি দৈর্ঘ্য সম্পন্ন উপাদান কোলেকশনে যোগ করতে দেয়।

ListDecorator কোলেকশনকে মোড়ানো (wrap) করে, এবং predicate যোগ করে যাতে ফিল্টারিং কার্যকারিতা প্রদান করা যায়।

১.২ Decorator উদাহরণ: MapDecorator

MapDecorator-এর মাধ্যমে আপনি একটি ম্যাপ কোলেকশনের উপর অতিরিক্ত বৈশিষ্ট্য যোগ করতে পারেন।

import org.apache.commons.collections4.MapUtils;
import java.util.HashMap;
import java.util.Map;

public class MapDecoratorExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("apple", 10);
        map.put("banana", 20);
        
        // Decorate the map to make all values positive
        Map<String, Integer> decoratedMap = MapUtils.transformValues(map, value -> Math.abs(value));
        
        System.out.println(decoratedMap);  // Output: {apple=10, banana=20}
    }
}

এখানে:

  • MapUtils.transformValues() মেথড ব্যবহার করে Map কোলেকশনকে Decorator করা হয়েছে যাতে সব মান পজিটিভ (positive) হয়ে যায়। এটি মানের পরিবর্তন করবে এবং ম্যাপের প্রতি উপাদানকে নতুন আচরণ দেবে।

২. Wrapped Collections কী?

Wrapped Collections হল সেই কোলেকশনগুলি যা অন্য একটি কোলেকশনের উপরে "wrap" করা হয়, অর্থাৎ মূল কোলেকশনের আচরণ এবং স্টেটাস পরিবর্তন না করেই অতিরিক্ত কার্যকারিতা যোগ করা হয়। Wrapped Collections প্রাথমিক কোলেকশনের সকল কার্যকারিতা বজায় রাখে এবং নতুন ফিচার যোগ করে।

Wrapped Collections সাধারণত এমন কোলেকশন ক্লাস হয় যা কেবলমাত্র কিছু অতিরিক্ত কাস্টম কার্যকারিতা প্রদান করে। এটি কোলেকশনগুলির পছন্দসই আচরণ তৈরি করতে সাহায্য করে।

২.১ উদাহরণ: Unmodifiable Collection

Unmodifiable Collection এমন একটি wrapped কোলেকশন যা কেবলমাত্র পঠনযোগ্য হয়, অর্থাৎ এর মধ্যে কোন উপাদান পরিবর্তন করা যায় না।

import org.apache.commons.collections4.CollectionUtils;
import java.util.List;
import java.util.ArrayList;

public class WrappedCollectionExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("banana");
        
        // Wrap the list into an unmodifiable collection
        List<String> unmodifiableList = CollectionUtils.unmodifiableList(list);
        
        // Attempt to modify the list will throw an UnsupportedOperationException
        unmodifiableList.add("cherry");  // Throws UnsupportedOperationException
    }
}

এখানে:

  • CollectionUtils.unmodifiableList() মেথড ব্যবহার করে একটি কোলেকশনকে unmodifiable করা হয়েছে। এটি কোলেকশনের উপাদানগুলো পরিবর্তন করতে দেয় না এবং শুধুমাত্র পড়তে দেয়।

২.২ উদাহরণ: Synchronized Collection

Synchronized Collection কোলেকশনের উপর থ্রেড-সেফ কার্যকারিতা যোগ করতে ব্যবহৃত হয়, যাতে এটি মাল্টিথ্রেড পরিবেশে নিরাপদ থাকে।

import org.apache.commons.collections4.CollectionUtils;
import java.util.List;
import java.util.ArrayList;

public class SynchronizedCollectionExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("banana");

        // Wrap the list into a synchronized collection
        List<String> synchronizedList = CollectionUtils.synchronizedList(list);

        synchronizedList.add("cherry");  // This operation is now thread-safe
    }
}

এখানে:

  • CollectionUtils.synchronizedList() মেথড ব্যবহার করে কোলেকশনটি থ্রেড-সেফ করা হয়েছে। এখন এটি মাল্টিথ্রেড অ্যাক্সেসের জন্য নিরাপদ।

৩. Decorators এবং Wrapped Collections এর ব্যবহার

  • Decorators কোলেকশনের উপরে অতিরিক্ত কার্যকারিতা যোগ করতে ব্যবহৃত হয়, যেমন কোলেকশনের উপাদানগুলির ওপর ফিল্টারিং বা পরিবর্তন করা।
  • Wrapped Collections মূল কোলেকশনের আচরণ পরিবর্তন না করে তা নতুন বৈশিষ্ট্য (যেমন, এক্সেস কন্ট্রোল বা থ্রেড সেফটি) প্রদান করে।

কিছু সাধারণ ব্যবহার:

  • Decorator ব্যবহার করে কোলেকশনে ফিল্টারিং, ট্রান্সফর্মেশন বা ভ্যালিডেশন যোগ করা।
  • Wrapped Collection ব্যবহার করে কোলেকশনে সুরক্ষা, থ্রেড সেফটি বা কোলেকশনটি অপরিবর্তনীয় (immutable) করা।

সারাংশ

Decorators এবং Wrapped Collections দুটি গুরুত্বপূর্ণ কনসেপ্ট যা Apache Commons Collections লাইব্রেরি সরবরাহ করে। Decorators কোলেকশনের উপরে অতিরিক্ত আচরণ বা কার্যকারিতা যোগ করে, যেখানে Wrapped Collections কোলেকশনের আচরণে পরিবর্তন না এনে নতুন বৈশিষ্ট্য (যেমন থ্রেড সেফটি বা অপরিবর্তনীয়তা) যোগ করে। এই দুটি কনসেপ্ট কোলেকশন ম্যানিপুলেশনের ক্ষেত্রে অনেক সুবিধা প্রদান করে, যেমন কোলেকশনের শর্তসাপেক্ষ পরিবর্তন, সুরক্ষা বৃদ্ধি এবং আরো অনেক কিছু।

common.content_added_by

Collection Decorators এর ভূমিকা

130
130

Apache Commons Collections লাইব্রেরির Collection Decorators ক্লাসগুলি Java Collections Framework (JCF)-এর ডেটা স্ট্রাকচারে অতিরিক্ত কার্যকারিতা যোগ করার জন্য ব্যবহৃত হয়। Decorator pattern হল একটি স্ট্রাকচারাল ডিজাইন প্যাটার্ন যা অবজেক্টের উপর নতুন ফাংশনালিটি যোগ করার জন্য ব্যবহৃত হয়, কোন কিছুর মূল স্ট্রাকচার পরিবর্তন না করে। এটি একই সময় existing object এর আচরণ পরিবর্তন বা প্রসারিত করতে সাহায্য করে।

১. Collection Decorators কী?

Collection Decorators হল এমন ক্লাস যা collections এর কার্যকারিতা বাড়াতে বা কাস্টমাইজ করতে ব্যবহৃত হয়। একে wrapper objects হিসেবে ভাবা যেতে পারে, যেখানে একটি ইন্টারফেস বা ক্লাসের অভ্যন্তরে অন্য একটি collection অবজেক্টের উপর অতিরিক্ত আচরণ যোগ করা হয়। Decorator pattern এর মাধ্যমে একটি অবজেক্টের কার্যকারিতা পরিবর্তন করার বদলে, তার উপরে নতুন ফিচার যোগ করা হয়।

যেমন, আপনি যদি একটি List বা Map এর উপর কিছু অতিরিক্ত কার্যকলাপ (যেমন সিঙ্ক্রোনাইজেশন, ইমিউটেবিলিটি) চান, তাহলে আপনি একটি Decorator ব্যবহার করতে পারেন যা ওই ফিচারটি সুনিশ্চিত করবে।

২. Collection Decorators এর প্রধান সুবিধা

  • ডেটা স্ট্রাকচারের আচরণ পরিবর্তন করা: আপনি সহজেই একটি কালেকশন স্ট্রাকচারকে immutable, synchronized, বা অন্যান্য অতিরিক্ত কার্যকারিতা দিতে পারেন।
  • অতিরিক্ত কার্যকলাপ যোগ করা: ডেকোরেটর প্যাটার্নের মাধ্যমে আপনার মূল কালেকশনের কার্যকারিতা প্রসারিত করা যায়, যেমন logging, validation, বা counting
  • কমপ্লেক্সিটি হ্যান্ডেল করা: কখনও কখনও খুব জটিল এবং কঠিন অপারেশনগুলোকে সহজ করা হয়, যেমন Thread safety বা immutable collections তৈরি করা।

৩. Collection Decorators এর উদাহরণ

Apache Commons Collections লাইব্রেরি Collection Decorators এর মাধ্যমে বিভিন্ন ধরনের অতিরিক্ত কার্যকারিতা যোগ করার সুযোগ দেয়, যেমন Synchronized collections, Unmodifiable collections, Predicated collections ইত্যাদি। নিচে কিছু সাধারণ Collection Decorators এর উদাহরণ দেওয়া হলো:

১. Unmodifiable Collections

Unmodifiable collections হল এমন কালেকশন যা immutable (অপরিবর্তনীয়), যেখানে আপনি ডেটা পরিবর্তন করতে পারবেন না। এটি সাধারণত তখন ব্যবহৃত হয় যখন আপনি চান যে, কিছু Collection ডেটা নিরাপদভাবে শুধুমাত্র পড়ার জন্য ব্যবহার করা হোক।

Unmodifiable Collection ডেকোরেটরের উদাহরণ:

import org.apache.commons.collections4.CollectionUtils;
import java.util.List;
import java.util.Arrays;

public class UnmodifiableCollectionExample {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("apple", "banana", "cherry");
        
        // Creating an unmodifiable collection
        List<String> unmodifiableList = CollectionUtils.unmodifiableList(list);

        System.out.println("Unmodifiable List: " + unmodifiableList);

        // Attempting to modify will throw UnsupportedOperationException
        // unmodifiableList.add("date"); // This will throw exception
    }
}

এখানে:

  • CollectionUtils.unmodifiableList() ব্যবহার করে একটি List কে unmodifiable করা হয়েছে, যার মাধ্যমে তার উপাদান পরিবর্তন করা সম্ভব নয়।

আউটপুট:

Unmodifiable List: [apple, banana, cherry]

এটি immutable collection তৈরি করে, যেটি কোনো পরিবর্তন গ্রহণ করবে না।

২. Synchronized Collections

Synchronized Collections হল এমন কালেকশন যেগুলি একাধিক থ্রেডের মধ্যে নিরাপদভাবে ব্যবহৃত হতে পারে। যখন আপনি একাধিক থ্রেডের সাথে কাজ করেন এবং কালেকশনের উপরে একযোগে অপারেশন চালাতে চান, তখন synchronized collections ব্যবহার করা হয়।

Synchronized Collection ডেকোরেটরের উদাহরণ:

import org.apache.commons.collections4.CollectionUtils;
import java.util.List;
import java.util.Arrays;

public class SynchronizedCollectionExample {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("apple", "banana", "cherry");
        
        // Creating a synchronized collection
        List<String> synchronizedList = CollectionUtils.synchronizedList(list);

        synchronized(synchronizedList) {
            synchronizedList.add("date");
            System.out.println(synchronizedList);
        }
    }
}

এখানে:

  • CollectionUtils.synchronizedList() ব্যবহার করা হয়েছে একটি List কে সিঙ্ক্রোনাইজড করার জন্য, যাতে এটি একাধিক থ্রেডের মধ্যে নিরাপদে ব্যবহার করা যায়।

আউটপুট:

[apple, banana, cherry, date]

এটি নিশ্চিত করে যে, যখন একাধিক থ্রেড একই কালেকশনের উপরে কাজ করে, তখন ডেটা সুরক্ষিত থাকে।

৩. Predicated Collections

Predicated collections হল এমন কালেকশন যা একটি নির্দিষ্ট শর্ত বা predicate (যেমন একটি ফিল্টার) এর উপর ভিত্তি করে কার্যকরী হয়। এটি আপনাকে কালেকশনের মধ্যে শুধু নির্দিষ্ট ধরনের উপাদান সংরক্ষণ করতে সাহায্য করে।

Predicated Collection ডেকোরেটরের উদাহরণ:

import org.apache.commons.collections4.CollectionUtils;
import java.util.List;
import java.util.ArrayList;

public class PredicatedCollectionExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("banana");
        list.add("cherry");

        // Creating a predicated collection that only allows strings with length greater than 5
        List<String> predicatedList = CollectionUtils.predicatedList(list, str -> str.length() > 5);

        predicatedList.add("grapefruit");
        
        System.out.println(predicatedList);  // Output: [grapefruit]

        // Trying to add an invalid string
        predicatedList.add("pear");  // This will not be added
        System.out.println(predicatedList);  // Output: [grapefruit]
    }
}

এখানে:

  • CollectionUtils.predicatedList() ব্যবহার করে একটি List তৈরি করা হয়েছে, যেখানে শুধুমাত্র সেই উপাদানগুলো অন্তর্ভুক্ত হবে যেগুলোর দৈর্ঘ্য ৫ এর বেশি।

আউটপুট:

[grapefruit]
[grapefruit]

এটি কেবলমাত্র নির্দিষ্ট শর্ত পূর্ণকারী উপাদানগুলি কেবলমাত্র List-এ যোগ করতে অনুমতি দেয়।


৪. Collection Decorators এর ব্যবহারিক সুবিধা

  1. অতিরিক্ত কার্যকারিতা যোগ করা: আপনি collection decorators ব্যবহার করে বিভিন্ন ধরনের কার্যকারিতা যেমন immutable, synchronized, এবং predicated ফিল্টার যুক্ত করতে পারেন।
  2. উন্নত ডেটা নিরাপত্তা: Immutable এবং Synchronized ডেকোরেটর ব্যবহার করে ডেটা সুরক্ষা নিশ্চিত করা যায়, বিশেষত একাধিক থ্রেডের মধ্যে।
  3. ডেটা ম্যানিপুলেশন সহজ করা: Predicated এবং Unmodifiable ডেকোরেটর ব্যবহার করে আপনি ডেটার উপর ফিল্টার বা কনস্ট্রেইন্ট প্রয়োগ করতে পারেন।

সারাংশ

Collection Decorators হল একটি শক্তিশালী টুল যা Apache Commons Collections লাইব্রেরিতে Java Collections Framework-এর উপরে অতিরিক্ত কার্যকারিতা যোগ করতে ব্যবহৃত হয়। এগুলি Java ডেভেলপারদের জন্য বিভিন্ন ধরনের স্ট্যান্ডার্ড কোলেকশন ডেটা স্ট্রাকচারের উপর functional extensions প্রদান করে, যেমন immutable collections, synchronized collections, এবং predicated collectionsDecorator pattern ব্যবহার করে এই কার্যকারিতা যোগ করা হয়, যা মূল ডেটা স্ট্রাকচারের কার্যকারিতা পরিবর্তন না করে নতুন ফিচার সরবরাহ করে।

common.content_added_by

Synchronized এবং Unmodifiable Collections তৈরি

120
120

Apache Commons Collections একটি শক্তিশালী লাইব্রেরি যা Java Collections Framework এর উপর ভিত্তি করে অতিরিক্ত কার্যকারিতা এবং ডাটা স্ট্রাকচার সরবরাহ করে। এর মধ্যে Synchronized Collections এবং Unmodifiable Collections তৈরি করার জন্য বিভিন্ন সুবিধাজনক ইউটিলিটি ক্লাস রয়েছে, যা আপনাকে থ্রেড সেফ কালেকশন তৈরি এবং কালেকশন পরিবর্তন প্রতিরোধ করতে সাহায্য করে।

Synchronized Collections

Synchronized Collections এমন কালেকশন, যা Thread-safe হয়, অর্থাৎ একাধিক থ্রেড একই কালেকশনে একই সময়ে ডেটা অ্যাক্সেস বা পরিবর্তন করতে পারে না। এতে আপনি সহজেই নিশ্চিত করতে পারেন যে, কালেকশন এর উপর কোনো একসাথে একাধিক থ্রেড কাজ করলে ডেটার কোন ধরনের ক্ষতি বা অসামঞ্জস্য হবে না।

Synchronized Collections তৈরি করা:

Synchronized Collections তৈরি করতে Collections.synchronizedXXX() পদ্ধতি ব্যবহার করা হয়। তবে, Apache Commons Collections এ এই ধরনের বিশেষ Synchronized Collections এর জন্যও ইউটিলিটি ক্লাস প্রদান করা হয়েছে।

Apache Commons Collections তে SynchronizedCollection, SynchronizedList, SynchronizedSet, SynchronizedMap ইত্যাদি ক্লাস ব্যবহার করে সিঙ্ক্রোনাইজড কালেকশন তৈরি করা যায়।

Synchronized Collection Example:

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.list.SynchronizedList;

import java.util.ArrayList;
import java.util.List;

public class SynchronizedCollectionExample {
    public static void main(String[] args) {
        // Create a normal list
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("banana");
        list.add("cherry");

        // Make the list synchronized
        List<String> synchronizedList = CollectionUtils.synchronizedList(list);

        // Access the synchronized list in a thread-safe manner
        synchronized(synchronizedList) {
            synchronizedList.forEach(System.out::println);
        }
    }
}

এখানে:

  • CollectionUtils.synchronizedList() ব্যবহার করে ArrayList কে Thread-safe সিঙ্ক্রোনাইজড লিস্টে রূপান্তরিত করা হয়েছে।

Synchronized Set Example:

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.set.SynchronizedSet;

import java.util.HashSet;
import java.util.Set;

public class SynchronizedSetExample {
    public static void main(String[] args) {
        // Create a normal set
        Set<String> set = new HashSet<>();
        set.add("apple");
        set.add("banana");
        set.add("cherry");

        // Make the set synchronized
        Set<String> synchronizedSet = CollectionUtils.synchronizedSet(set);

        // Access the synchronized set in a thread-safe manner
        synchronized(synchronizedSet) {
            synchronizedSet.forEach(System.out::println);
        }
    }
}

এখানে:

  • CollectionUtils.synchronizedSet() ব্যবহার করে HashSet কে Thread-safe সিঙ্ক্রোনাইজড সেটে রূপান্তরিত করা হয়েছে।

Unmodifiable Collections

Unmodifiable Collections এমন কালেকশন যেগুলোর উপাদান পরিবর্তন করা সম্ভব নয়। একবার যদি একটি কালেকশন unmodifiable হয়ে যায়, তাহলে আপনি সেই কালেকশনে নতুন আইটেম অ্যাড বা রিমুভ করতে পারবেন না, শুধুমাত্র পড়া (read) সম্ভব হবে। এই ধরনের কালেকশন নিরাপত্তা নিশ্চিত করতে সাহায্য করে, যেমন: আপনার ডেটা যাতে অপ্রত্যাশিতভাবে পরিবর্তিত না হয়।

Unmodifiable Collections তৈরি করা:

Unmodifiable Collections তৈরি করতে Collections.unmodifiableXXX() পদ্ধতি ব্যবহার করা হয়। তবে, Apache Commons Collections লাইব্রেরি UnmodifiableCollection, UnmodifiableList, UnmodifiableSet, UnmodifiableMap ইত্যাদি ক্লাসও প্রদান করে।

Unmodifiable List Example:

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.list.UnmodifiableList;

import java.util.ArrayList;
import java.util.List;

public class UnmodifiableListExample {
    public static void main(String[] args) {
        // Create a normal list
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("banana");
        list.add("cherry");

        // Make the list unmodifiable
        List<String> unmodifiableList = CollectionUtils.unmodifiableList(list);

        // Try to modify the list (will throw UnsupportedOperationException)
        // unmodifiableList.add("date"); // Uncommenting this line will throw an exception
        
        // Print the list
        unmodifiableList.forEach(System.out::println);
    }
}

এখানে:

  • CollectionUtils.unmodifiableList() ব্যবহার করে একটি ArrayList কে Unmodifiable লিস্টে রূপান্তরিত করা হয়েছে।
  • এখানে unmodifiableList.add("date") লাইনটি কমেন্ট করলে চলবে, তবে এটি অ্যাড করার চেষ্টা করলে UnsupportedOperationException ফেলে।

Unmodifiable Set Example:

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.set.UnmodifiableSet;

import java.util.HashSet;
import java.util.Set;

public class UnmodifiableSetExample {
    public static void main(String[] args) {
        // Create a normal set
        Set<String> set = new HashSet<>();
        set.add("apple");
        set.add("banana");
        set.add("cherry");

        // Make the set unmodifiable
        Set<String> unmodifiableSet = CollectionUtils.unmodifiableSet(set);

        // Try to modify the set (will throw UnsupportedOperationException)
        // unmodifiableSet.add("date"); // Uncommenting this line will throw an exception
        
        // Print the set
        unmodifiableSet.forEach(System.out::println);
    }
}

এখানে:

  • CollectionUtils.unmodifiableSet() ব্যবহার করে HashSet কে Unmodifiable সেটে রূপান্তরিত করা হয়েছে।

Synchronized vs Unmodifiable Collections

FeatureSynchronized CollectionUnmodifiable Collection
PurposeThread-safety and concurrencyPrevent modification (immutability)
ModificationAllowed, but thread-safeNot allowed (no modification)
Use CaseUsed when multiple threads access and modify collectionsUsed to protect data from unintended modifications
PerformanceSlightly slower due to synchronizationMore performant as no locks or synchronization are needed
ImplementationSynchronized using locking mechanismsWraps the collection to prevent modification

সারাংশ

Synchronized Collections এবং Unmodifiable Collections দুটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা Apache Commons Collections লাইব্রেরি প্রদান করে। Synchronized Collections থ্রেড সেফ কালেকশন তৈরি করে, যেখানে একাধিক থ্রেড একই সময় কালেকশনে ডেটা অ্যাক্সেস বা পরিবর্তন করতে পারে না। অন্যদিকে, Unmodifiable Collections নিশ্চিত করে যে একবার তৈরি হওয়া কালেকশন পরিবর্তন করা যাবে না, যা ডেটা নিরাপত্তা এবং স্থিরতা বজায় রাখে। উভয় ধরনের কালেকশন আপনাকে নিরাপদ এবং কার্যকরী ডাটা ম্যানেজমেন্ট নিশ্চিত করতে সাহায্য করে, বিশেষ করে মাল্টি-থ্রেডেড পরিবেশে বা ডেটার স্থিরতা বজায় রাখতে।

common.content_added_by

Lazy Collections তৈরি করা

131
131

Lazy Collections হল এমন ধরনের কালেকশন যা কেবল তখনই উপাদান বা মান গণনা বা তৈরি করে যখন সেগুলি প্রকৃতপক্ষে প্রয়োজন হয়। এটি Lazy Evaluation ধারণার উপর ভিত্তি করে কাজ করে, যার মাধ্যমে কালেকশনের উপাদানগুলো প্রয়োজন না হওয়া পর্যন্ত হিসাব করা বা তৈরি করা হয় না। Lazy Collections ব্যবহার করার মাধ্যমে আপনি মেমরি এবং প্রক্রিয়াকরণ সময় সাশ্রয় করতে পারেন, বিশেষত যখন আপনার বড় আকারের ডেটা স্ট্রাকচার বা সংগ্রহে কাজ করতে হয়।

Apache Commons Collections লাইব্রেরিতে কিছু Lazy Collection তৈরি করার জন্য ইউটিলিটি সরঞ্জাম সরবরাহ করা হয়, যা আপনার কাজকে আরও কার্যকরী করে তোলে।


Lazy Collections কী?

Lazy Collections এমন কালেকশন যা অটো বা বিকল্পভাবে উপাদানগুলি রিট্রিভ করে এবং হিসাব করে, অর্থাৎ উপাদানগুলি তখনই তৈরি হয় যখন সেগুলি অ্যাক্সেস করা হয়। এর ফলে সম্পূর্ণ কালেকশন মেমরিতে লোড না হয়ে শুধুমাত্র প্রয়োজনীয় উপাদানগুলো লোড হয়।

এটি বড় কালেকশনগুলিতে বিশেষভাবে উপকারী, যেখানে আপনি বড় পরিসরের ডেটা প্রক্রিয়া না করেও নির্দিষ্ট ডেটা পেতে পারেন। উদাহরণস্বরূপ, যদি আপনার কাছে একটি বড় list থাকে তবে লেজি কালেকশন কেবল সেই উপাদানটি রিট্রিভ করবে যেটি আপনার প্রয়োজন এবং অন্য কোনো উপাদান রিট্রিভ করবে না।


Lazy Collection তৈরি করা Apache Commons Collections ব্যবহার করে

Apache Commons Collections লাইব্রেরি Lazy Collections তৈরি করার জন্য LazyList, LazyMap, এবং অন্যান্য কাস্টম Lazy কোড ব্যবহার করে। এই লাইব্রেরি আপনাকে Lazy Collection বাস্তবায়ন করতে সহায়তা করে।

LazyList ব্যবহার করা

LazyList একটি বিশেষ ধরনের List যা উপাদানগুলোকে lazy load বা প্রক্রিয়া করে।

LazyList এর উদাহরণ:

import org.apache.commons.collections4.ListUtils;
import org.apache.commons.collections4.list.LazyList;
import org.apache.commons.collections4.functors.ConstantTransformer;

import java.util.List;

public class LazyListExample {
    public static void main(String[] args) {
        // Creating a LazyList that lazily transforms all elements to uppercase
        List<String> lazyList = LazyList.decorate(ListUtils.lazyList(new java.util.ArrayList<>()), new ConstantTransformer("default"));

        // Adding items lazily
        lazyList.add("apple");
        lazyList.add("banana");

        // Accessing elements lazily
        System.out.println(lazyList.get(0));  // Will print "apple"
        System.out.println(lazyList.get(1));  // Will print "banana"
    }
}

ব্যাখ্যা:

  • LazyList.decorate() মেথডটি ব্যবহার করে একটি lazy list তৈরি করা হয়েছে। এটি একটি ArrayList ডেকোরেট করে এবং প্রতিটি নতুন উপাদানকে lazy load করবে।
  • এখানে, ConstantTransformer ব্যবহার করা হয়েছে, যা lazy initialization এর মাধ্যমে default value প্রদান করে।
  • যখন উপাদানটি প্রাপ্ত হবে তখন এটি ডেকোরেটেড লিস্ট থেকে সঠিক উপাদান রিটার্ন করবে।

LazyMap ব্যবহার করা

LazyMap একটি বিশেষ ধরনের Map যা lazy load এর মাধ্যমে কীগুলির জন্য মান রিটার্ন করে। এটি মূলত LazyList এর মতো কাজ করে, তবে এটি একটি Map ডেটা স্ট্রাকচার ব্যবহারের জন্য ডিজাইন করা হয়েছে।

LazyMap এর উদাহরণ:

import org.apache.commons.collections4.MapUtils;
import org.apache.commons.collections4.map.LazyMap;
import org.apache.commons.collections4.functors.ConstantTransformer;

import java.util.HashMap;
import java.util.Map;

public class LazyMapExample {
    public static void main(String[] args) {
        // Creating a LazyMap that lazily transforms all keys
        Map<String, String> lazyMap = LazyMap.decorate(new HashMap<String, String>(), new ConstantTransformer("default"));

        // Adding key-value pairs lazily
        lazyMap.put("name", "Alice");
        lazyMap.put("age", "30");

        // Accessing keys lazily
        System.out.println(lazyMap.get("name"));  // Will print "Alice"
        System.out.println(lazyMap.get("age"));   // Will print "30"
        System.out.println(lazyMap.get("address"));  // Will print "default"
    }
}

ব্যাখ্যা:

  • LazyMap.decorate() মেথডটি ব্যবহার করে একটি lazy map তৈরি করা হয়েছে। এখানে ConstantTransformer ব্যবহার করা হয়েছে, যা একটি ডিফল্ট মান প্রদান করে যখন Map এ নির্দিষ্ট কীগুলির মান উপস্থিত না থাকে।
  • যখন আমরা address কীগুলি রিটার্ন করতে চেয়েছি, যেটি মাপে নেই, তখন এটি ডিফল্ট মান প্রদান করেছে ("default")।

Lazy Collections এর সুবিধা:

  1. Memory Efficiency: Lazy collections কেবল তখনই ডেটা লোড করে যখন তা প্রয়োজন হয়, ফলে মেমরি ব্যবহার কমে।
  2. Performance: শুধু প্রয়োজনীয় উপাদানগুলি প্রক্রিয়া করে, যার ফলে আপনার অ্যাপ্লিকেশনের কর্মক্ষমতা বাড়াতে সাহায্য করে, বিশেষ করে বড় আকারের ডেটাসেটে।
  3. Large Data Handling: Lazy collections বড় আকারের ডেটা স্ট্রাকচারে খুবই কার্যকরী, কারণ এটি সম্পূর্ণ ডেটা একবারে মেমরিতে লোড না করে শুধুমাত্র প্রয়োজনীয় উপাদানগুলো লোড করে।
  4. On-demand Initialization: Lazy collections প্রয়োজনীয় সময়ে ইনিশিয়ালাইজ হয়, ফলে ডেটা আনার প্রক্রিয়া শুধুমাত্র তখনই চলে যখন এটি আসলেই দরকার হয়।

Lazy Collections এর সীমাবদ্ধতা:

  1. Complexity: Lazy collections ব্যবহারের কারণে কিছু সময় কমপ্লেক্সিটি বাড়তে পারে, বিশেষত যদি সেগুলির ব্যবস্থাপনা না করা হয় বা সঠিকভাবে লোড না হয়।
  2. Thread Safety: Lazy collections যখন একাধিক থ্রেডে ব্যবহৃত হয়, তখন এটি thread safety এর জন্য সঠিকভাবে কনফিগার করা প্রয়োজন। কিছু কালেকশন টাইপের জন্য অতিরিক্ত সতর্কতা প্রয়োজন।
  3. Increased Latency: Lazy collections ডেটা রিট্রিভাল এবং প্রক্রিয়া করার সময় প্রাথমিকভাবে কিছু বিলম্ব ঘটাতে পারে, বিশেষত যখন অনেক ডেটা লোড করা হয়।

Lazy Collections Apache Commons Collections লাইব্রেরির একটি শক্তিশালী বৈশিষ্ট্য যা মেমরি ও পারফরম্যান্স অপ্টিমাইজেশনের জন্য কার্যকর। LazyList এবং LazyMap ব্যবহার করে আপনি কেবলমাত্র প্রয়োজনীয় উপাদানগুলি লোড করতে পারবেন এবং বড় আকারের ডেটা সেটের সাথে কাজ করার সময় এটি কার্যকরী হতে পারে। তবে, এগুলির ব্যবহারের সময় complexity এবং thread safety এর প্রতি মনোযোগ দেওয়া প্রয়োজন।

common.content_added_by

Bounded Collections এর ব্যবহার

125
125

অ্যাপাচি কমন্স কালেকশনস (Apache Commons Collections) একটি শক্তিশালী জাভা লাইব্রেরি যা জাভা প্রোগ্রামে উন্নত ডেটা স্ট্রাকচার এবং ইউটিলিটি সরবরাহ করে। এর মধ্যে Bounded Collections ব্যবহারের মাধ্যমে আপনি কালেকশনগুলোতে উপাদানের সংখ্যা নির্ধারণ করতে পারেন, অর্থাৎ একটি নির্দিষ্ট সীমা (boundary) পর্যন্ত উপাদান রাখতে পারবেন। এটি বিশেষভাবে উপকারী যখন আপনি একটি কালেকশনের আকার সীমাবদ্ধ করতে চান বা এর আকারের উপর কিছু নিয়ন্ত্রণ রাখতে চান।

Bounded Collections সাধারণত Queue, List, অথবা Set এর মতো ডেটা স্ট্রাকচারে ব্যবহৃত হয়, যেখানে আপনি চাইবেন যে কালেকশনটি নির্দিষ্ট আকারের বেশি না হয়ে যায়। অ্যাপাচি কমন্স কালেকশনসে Bounded Collection ক্লাস যেমন BoundedList, BoundedSet, BoundedQueue ইত্যাদি অন্তর্ভুক্ত রয়েছে।


Bounded Collections এর সুবিধা:

  1. সীমিত আকার: Bounded Collections একটি নির্দিষ্ট আকার পর্যন্ত উপাদান সংরক্ষণ করে। যখন কালেকশনে নির্দিষ্ট আকার পূর্ণ হয়ে যায়, তখন নতুন উপাদান যোগ করতে গেলে পুরানো উপাদান মুছে ফেলা হয় (এটি সাধারণত FIFO বা LRU পদ্ধতিতে হতে পারে)।
  2. মেমরি ব্যবস্থাপনা: সীমিত আকারের কালেকশনগুলি মেমরি ব্যবস্থাপনায় সহায়ক, কারণ এটি একাধিক ডাটা প্রবাহ বা প্রক্রিয়া পরিচালনা করার সময় অতিরিক্ত মেমরি দখল থেকে রক্ষা করে।
  3. আকস্মিক বৃদ্ধি রোধ: সীমিত আকারের কালেকশনগুলি প্রোগ্রামের আকস্মিক আকার বৃদ্ধির সমস্যা দূর করে।

Bounded Collection এর প্রধান ব্যবহারকারী কেস:

  1. FIFO Queue (First In First Out): সীমিত আকারের কিউয়ে পুরানো উপাদানগুলি মুছে ফেলা হয় এবং নতুন উপাদান প্রবেশ করানো হয়। এটি ব্যবহৃত হয়, যেমন সিস্টেমে তথ্য স্টোর করার জন্য যেখানে নতুন তথ্য আসে এবং পুরনো তথ্য মুছে ফেলা হয়।
  2. LRU (Least Recently Used) Cache: সর্বশেষ ব্যবহৃত না হওয়া উপাদান মুছে ফেলা হয় যখন সীমিত আকারে নতুন উপাদান যোগ করা হয়। এটি কার্যকরী হয় যখন একটি ক্যাশে সীমিত আকারের ডাটা ধারণ করে।

Bounded Collection এর বাস্তবায়ন

1. BoundedList:

BoundedList একটি List টাইপের কালেকশন যা একটি নির্দিষ্ট আকার পর্যন্ত উপাদান ধারণ করতে পারে। যখন এই লিস্টে উপাদানের সংখ্যা পূর্ণ হয়ে যায়, নতুন উপাদান যুক্ত করার সময় এটি পুরনো উপাদান সরিয়ে ফেলে।

BoundedList উদাহরণ:

import org.apache.commons.collections4.ListUtils;
import org.apache.commons.collections4.collection.GrowingList;

import java.util.List;

public class BoundedListExample {
    public static void main(String[] args) {
        // Create a Bounded List with a limit of 3 elements
        List<String> list = ListUtils.predicatedList(new GrowingList<String>(3), input -> true);
        
        // Add elements to the list
        list.add("apple");
        list.add("banana");
        list.add("orange");
        
        // The list is full, so adding another element will remove the first element (apple)
        list.add("grape");
        
        // Print the elements of the list
        System.out.println(list);  // Output: [banana, orange, grape]
    }
}

এখানে, GrowingList ব্যবহার করা হয়েছে যা ৩টি উপাদান ধারণ করতে পারে। যখন ৩টি উপাদান যোগ করা হয়েছে, তখন নতুন উপাদান "grape" যুক্ত করার জন্য পুরনো উপাদান "apple" সরিয়ে ফেলা হয়েছে।

2. BoundedQueue:

BoundedQueue একটি কিউ (Queue) টাইপের কালেকশন যা একটি নির্দিষ্ট সীমায় উপাদান ধারণ করতে পারে। এটি FIFO (First-In-First-Out) নিয়মে কাজ করে এবং যখন কিউটি পূর্ণ হয়ে যায়, নতুন উপাদান যুক্ত করার সময় পুরনো উপাদান সরিয়ে ফেলা হয়।

BoundedQueue উদাহরণ:

import org.apache.commons.collections4.queue.CircularFifoQueue;

import java.util.Queue;

public class BoundedQueueExample {
    public static void main(String[] args) {
        // Create a Bounded Queue with a limit of 3 elements
        Queue<String> queue = new CircularFifoQueue<>(3);
        
        // Add elements to the queue
        queue.add("apple");
        queue.add("banana");
        queue.add("orange");
        
        // The queue is full, so adding another element will remove the first element (apple)
        queue.add("grape");
        
        // Print the elements of the queue
        System.out.println(queue);  // Output: [banana, orange, grape]
    }
}

এখানে CircularFifoQueue ব্যবহার করা হয়েছে, যা FIFO নিয়মে কাজ করে এবং একটি নির্দিষ্ট সীমায় উপাদান ধারণ করে। apple উপাদানটি কিউ থেকে সরিয়ে ফেলেছে grape যোগ করার সময়।

3. BoundedSet:

BoundedSet একটি Set টাইপের কালেকশন যা একটি নির্দিষ্ট সীমায় উপাদান ধারণ করতে পারে এবং নতুন উপাদান যোগ করার সময় সেটি পুরনো উপাদান সরিয়ে ফেলে। সাধারণত, এটি ব্যবহৃত হয় যখন আপনি অনন্য উপাদান রাখতে চান এবং তাদের সংখ্যা সীমিত করতে চান।

BoundedSet উদাহরণ:

import org.apache.commons.collections4.SetUtils;
import org.apache.commons.collections4.set.LazySet;

import java.util.Set;

public class BoundedSetExample {
    public static void main(String[] args) {
        // Create a Bounded Set with a limit of 3 elements
        Set<String> set = SetUtils.predicatedSet(new LazySet<String>(), input -> true);
        
        // Add elements to the set
        set.add("apple");
        set.add("banana");
        set.add("orange");
        
        // The set is full, so adding another element will remove the first element (apple)
        set.add("grape");
        
        // Print the elements of the set
        System.out.println(set);  // Output: [banana, orange, grape]
    }
}

এখানে, LazySet ব্যবহার করা হয়েছে, যা একটি সেটের মাধ্যমে একে অপরের সাথে সম্পর্কিত উপাদান রাখে এবং সীমিত আকারে ম্যানেজ করা হয়।


Bounded Collection এর ব্যবহারকারী কেস

  1. FIFO Queue: যখন আপনাকে এমন কিউ তৈরি করতে হয় যা সর্বশেষ যোগ করা উপাদানকে সর্বপ্রথম বের করে (প্রথমে ইন, প্রথমে আউট)। এটি কেবলমাত্র নির্দিষ্ট সংখ্যক উপাদান ধারণ করতে পারে।
  2. LRU Cache: যখন পুরনো উপাদানগুলি সরিয়ে নতুন উপাদানগুলো রাখতে হয়। এটি মেমরি ব্যবস্থাপনার জন্য কার্যকরী, যেখানে ক্যাশে সীমিত আকারের ডেটা রাখে।
  3. Real-time Event Processing: একাধিক ইভেন্ট প্রক্রিয়া করার সময় আপনি একটি সীমিত আকারের বাফার ব্যবহার করতে পারেন, যাতে সর্বশেষ ইভেন্টগুলির উপর কাজ করা হয় এবং পুরনো ইভেন্টগুলি সরিয়ে ফেলা হয়।

সারাংশ


Bounded Collections হল এমন একটি কালেকশন যা নির্দিষ্ট সীমায় উপাদান ধারণ করতে সক্ষম এবং নতুন উপাদান যোগ করার সময় পুরনো উপাদানগুলো সরিয়ে ফেলে। অ্যাপাচি কমন্স কালেকশনস লাইব্রেরিতে BoundedQueue, BoundedList, এবং BoundedSet এর মতো বিভিন্ন ধরনের বাউন্ডেড কালেকশন রয়েছে, যা FIFO বা অন্যান্য নিয়মে কাজ করে এবং ডেটা স্ট্রাকচারের আকার নিয়ন্ত্রণ করতে সাহায্য করে। Bounded Collections ব্যবহারের মাধ্যমে আপনি ডেটা সংগ্রহের আকার সীমাবদ্ধ করতে পারেন, মেমরি ব্যবস্থাপনা করতে পারেন, এবং দ্রুত এবং কার্যকরী ডেটা প্রসেসিং নিশ্চিত করতে পারেন।

common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion